home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 September / PCWorld_2008-09_cd.bin / v cisle / sadanastroju / greasemonkey-0.8.20080609.0-fx.xpi / chrome / greasemonkey.jar / chromeFiles / content / manage.js < prev    next >
Text File  |  2008-06-09  |  8KB  |  268 lines

  1. var config = GM_getConfig();
  2.  
  3. window.addEventListener("load", function(ev) {
  4.   loadControls();
  5.  
  6.   if (!config.scripts.length == 0) {
  7.     populateChooser();
  8.     chooseScript(0);
  9.   }
  10.  
  11.   config.addObserver(observer);
  12. }, false);
  13.  
  14. window.addEventListener("unload", function(ev) {
  15.   pagesControl.clear();
  16.   config.removeObserver(observer);
  17. }, false);
  18.  
  19. var observer = {
  20.   notifyEvent: function(script, event, data) {
  21.     var node = null;
  22.     for (var i = 0; node = listbox.childNodes[i]; i++)
  23.       if (node.script == script)
  24.         break;
  25.  
  26.     switch (event) {
  27.     case "edit-enabled":
  28.       node.style.color = data ? "" : "gray";
  29.       if (script == selectedScript)
  30.         chkEnabled.checked = data;
  31.       break;
  32.     case "install":
  33.       addListitem(script, -1);
  34.       break;
  35.     case "uninstall":
  36.       var selected = listbox.selectedItem == node;
  37.       listbox.removeChild(node);
  38.  
  39.       if (selected && listbox.childNodes.length > 0) {
  40.         chooseScript(Math.max(Math.min(listbox.selectedIndex, listbox.childNodes.length - 1), 0));
  41.       }
  42.       break;
  43.     case "move":
  44.       listbox.removeChild(node);
  45.       listbox.insertBefore(node, listbox.childNodes[data]);
  46.       // then re-select the dropped script
  47.       listbox.selectedIndex = data;
  48.       break;
  49.     }
  50.  
  51.     // fix the listbox indexes
  52.     for (var i = 0, n = null; n = listbox.childNodes[i]; i++) n.index=i;
  53.   }
  54. };
  55.  
  56. var listbox, header, description, chkEnabled, btnEdit, btnUninstall;
  57. var selectedScript;
  58. var pagesControl;
  59.  
  60. function loadControls() {
  61.   listbox = document.getElementById("lstScripts");
  62.   header = document.getElementById("ctlHeader");
  63.   description = document.getElementById("ctlDescription");
  64.   btnEdit = document.getElementById("btnEdit");
  65.   btnUninstall = document.getElementById("btnUninstall");
  66.   pagesControl = new PagesControl(document.getElementById("pages-control"));
  67.   chkEnabled = document.getElementById("chkEnabled");
  68.  
  69.   listbox.addEventListener("select", function() { updateDetails(); }, false);
  70.   btnEdit.addEventListener("command", function() { handleEditButton(); }, false);
  71.   btnUninstall.addEventListener("command", function() { handleUninstallButton(); }, false);
  72.   chkEnabled.addEventListener("command", function() {
  73.      if (selectedScript)
  74.        selectedScript.enabled = chkEnabled.checked;
  75.   }, false);
  76. }
  77.  
  78. function updateDetails() {
  79.   if (listbox.selectedCount == 0) {
  80.     selectedScript = null;
  81.     header.textContent = " ";
  82.     description.textContent = " ";
  83.     chkEnabled.checked = true;
  84.     pagesControl.clear();
  85.   } else {
  86.     selectedScript = listbox.getSelectedItem(0).script;
  87.  
  88.     // make sure one word isn't too long to fit ... a too-long word
  89.     // will bump the interface out wider than the window
  90.     var wordLen = 50;
  91.     var desc = selectedScript.description.split(/\s+/);
  92.     for (var i = 0; i < desc.length; i++) {
  93.       if (desc[i].length > wordLen) {
  94.         for (var j = desc[i].length; j > 0; j -= wordLen) {
  95.           desc[i] = desc[i].substr(0,j) + "\u200B" + desc[i].substr(j);
  96.         }
  97.       }
  98.     }
  99.     desc = desc.join(" ");
  100.  
  101.     header.textContent = selectedScript.name;
  102.     description.textContent = desc;
  103.     chkEnabled.checked = selectedScript.enabled;
  104.     pagesControl.populate(selectedScript);
  105.   }
  106. }
  107.  
  108. function handleEditButton() {
  109.   openInEditor(selectedScript);
  110. }
  111.  
  112. function handleUninstallButton() {
  113.   var uninstallPrefs = document.getElementById("chkUninstallPrefs").checked;
  114.   config.uninstall(selectedScript, uninstallPrefs);
  115. }
  116.  
  117. function populateChooser() {
  118.   var scripts = config.scripts;
  119.   for (var i = 0, script = null; (script = scripts[i]); i++)
  120.     addListitem(script, i);
  121. }
  122.  
  123. function addListitem(script, i) {
  124.   var listitem = document.createElement("listitem");
  125.  
  126.   listitem.setAttribute("label", script.name);
  127.   listitem.setAttribute("crop", "end");
  128.   listitem.script = script;
  129.   listitem.index = i;
  130.  
  131.   if (!script.enabled) {
  132.     listitem.style.color = "gray";
  133.   }
  134.  
  135.   listbox.appendChild(listitem);
  136. }
  137.  
  138. function chooseScript(index) {
  139.   listbox.selectedIndex = index;
  140.   listbox.focus();
  141. }
  142.  
  143. // allow reordering scripts with keyboard (alt- up and down)
  144. function listboxKeypress(event) {
  145.   if (0 == listbox.selectedCount) return;
  146.   if (!event.altKey) return;
  147.  
  148.   var index = listbox.selectedIndex;
  149.  
  150.   var move = null;
  151.   if (KeyEvent.DOM_VK_UP == event.keyCode)
  152.     move = config.move(listbox.selectedItem.script, -1);
  153.   else if (KeyEvent.DOM_VK_DOWN == event.keyCode)
  154.     move = config.move(listbox.selectedItem.script, 1);
  155. }
  156.  
  157. // allow reordering scripts with drag-and-drop
  158. var dndObserver = {
  159.   lastFeedbackIndex: null,
  160.  
  161.   getSupportedFlavours: function () {
  162.     var flavours = new FlavourSet();
  163.     flavours.appendFlavour("text/unicode");
  164.     return flavours;
  165.   },
  166.  
  167.   onDragStart: function (event, transferData, action) {
  168.     if ("listitem" != event.target.tagName ) return false;
  169.  
  170.     transferData.data = new TransferData();
  171.     transferData.data.addDataForFlavour("text/unicode", event.target.index);
  172.  
  173.     return true;
  174.   },
  175.  
  176.   onDragOver: function (event, flavour, session) {
  177.     if (listbox.selectedIndex == event.target.index) {
  178.       this.clearFeedback();
  179.       return false;
  180.     }
  181.  
  182.     return this.setFeedback(event);
  183.   },
  184.  
  185.   onDrop: function (event, dropdata, session) {
  186.     // clean up the feedback
  187.     this.lastFeedbackIndex = null;
  188.     this.clearFeedback();
  189.  
  190.     // figure out how to move
  191.     var newIndex = this.findNewIndex(event);
  192.     if (null === newIndex) return;
  193.     var index = parseInt(dropdata.data);
  194.     if (newIndex > index) newIndex--;
  195.  
  196.     // do the move
  197.     var move = config.move(config.scripts[index], config.scripts[newIndex]);
  198.   },
  199.  
  200.   //////////////////////////////////////////////////////////////////////////////
  201.  
  202.   setFeedback: function(event) {
  203.     var newIndex = this.findNewIndex(event);
  204.  
  205.     // don't do anything if we haven't changed
  206.     if (newIndex === this.lastFeedbackIndex) return false; // NOTE: possible incongruent logic
  207.     this.lastFeedbackIndex = newIndex;
  208.  
  209.     // clear any previous feedback
  210.     this.clearFeedback();
  211.  
  212.     // and set the current feedback
  213.     if (null === newIndex) {
  214.       return false;
  215.     } else if (listbox.selectedIndex == newIndex) {
  216.       return false;
  217.     } else {
  218.       if (0 == newIndex) {
  219.         listbox.firstChild.setAttribute("dragover", "top");
  220.       } else if (newIndex >= listbox.childNodes.length) {
  221.         listbox.lastChild.setAttribute("dragover", "bottom");
  222.       } else {
  223.         listbox.childNodes[newIndex - 1].setAttribute("dragover", "bottom");
  224.       }
  225.     }
  226.  
  227.     return true;
  228.   },
  229.  
  230.   clearFeedback: function() {
  231.     var box = document.getElementById("lstScripts");
  232.     for (var i = 0, el; el = box.childNodes[i]; i++) {
  233.       el.removeAttribute("dragover");
  234.     }
  235.   },
  236.  
  237.   findNewIndex: function(event) {
  238.     var target = event.target;
  239.  
  240.     // not in the list box? forget it!
  241.     if (listbox != target && listbox != target.parentNode) return null;
  242.  
  243.     var targetBox = target.boxObject
  244.       .QueryInterface(Components.interfaces.nsIBoxObject);
  245.  
  246.     if (listbox == target) {
  247.       // here, we are hovering over the listbox, not a particular listitem
  248.       // check if we are very near the top (y + 4), return zero, else return end
  249.       if (event.clientY < targetBox.y + 4) {
  250.         return 0;
  251.       } else {
  252.         return listbox.childNodes.length;
  253.       }
  254.     } else {
  255.       var targetMid = targetBox.y + (targetBox.height / 2);
  256.  
  257.       if (event.clientY >= targetMid) {
  258.         return target.index + 1;
  259.       } else {
  260.         return target.index;
  261.       }
  262.     }
  263.  
  264.     // should never get here, but in case
  265.     return null;
  266.   }
  267. };
  268.